#include "io_redirect.h"
#include "stdio.h"
#include "stdlib.h"

#if (osFeature_MailQ != 1)
#error "Please ensure macro \"osFeature_MailQ\" is 1 !"
#endif
//debug消息队列
osMessageQDef(io_q,10,char*);
osMessageQId io_q_id;

/**
 * TODO stdin redirection
 */
int _read(int file, char *ptr, int len)
{
	UNUSED(file);
	UNUSED(ptr);
	UNUSED(len);
	return len;
}

/**
 * stdout redirection
 */
int _write(int file, char *ptr, int len)
{
	UNUSED(file);

	char *p = malloc(len+1);
	if(p)
	{
		strncpy(p,ptr,len);
		p[len]=0;
		osMessagePut(io_q_id, p, 0);
		return len;
	}

	return 0;
}

/**
 * stdio task
 */
void StartIOTask(void const * argument)
{
	//创建消息队列
	io_q_id = osMessageCreate(osMessageQ(io_q), NULL);

	while(1)
	{
		osEvent tx_event;
		//等待消息队列
		tx_event = osMessageGet(io_q_id,osWaitForever);
		if(tx_event.status == osEventMessage)
		{
			char *p = tx_event.value.p;
			if(p)
			{
				//DMA发送
				if(HAL_OK!=HAL_UART_Transmit_DMA(&huart1, (uint8_t*)p, strlen(p)))
				{
					//DMA发送失败，请检查……？
					PRINT("DMA send error in StartIOTask()\r\n");
					Error_Handler();
				}
				//等待DMA发送完成
				tx_event = osSignalWait(IO_SIGNAL_TX_DONE, osWaitForever);
				//释放内存
				free(p);
			}
		}
	}
}

